package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Printf("numSquares(38): %v\n", Maxsqart(12))
}

/**
给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数，其值等于另一个整数的平方；
换句话说，其值等于一个整数自乘的积。
例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。
*/

/*
*
思考：
n = i*i+j*j+k*k
那我n-k*k = i*i+j*j， 其中i,j,k ∈[1,根号n],取整数

按照这种思想，我只需要从1开始遍历每个完全平方数，并记录就行了
*/
func numSquares(n int) int {
	f := make([]int, n+1)
	for i := 1; i <= n; i++ {
		minn := math.MaxInt32
		for j := 1; j*j <= i; j++ {
			minn = min(minn, f[i-j*j])
		}
		f[i] = minn + 1
	}
	return f[n]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
